#ifndef PROTOCOL_H
#define PROTOCOL_H

#include <QObject>

// Версия протокола
typedef enum
{
	PROTOCOL_VERSION       = 1   // Версия протокола
}Version;

typedef struct
{
	quint16 length;  // Длина строки
	quint8* data;    // Данные
}Gp_String;

// Типы сообщений
typedef enum
{
	VERSION_REQUEST        = 0x00,  // Запрос версии протокола
	VERSION_RESPONSE       = 0x01,  // Ответ на VERSION_REQUEST
	USER_LIST_REQUEST      = 0x02,  // Запрос списка пользователей
	USER_LIST_RESPONSE     = 0x03,  // Ответ на USER_LIST_REQUEST
	TEXT_MESSAGE_PUBLIC    = 0x04,  // Отправка текстового сообщения всем пользователям
	TEXT_MESSAGE_PRIVATE   = 0x05,  // Отправка текстового сообщения определенному пользователю
	GAME_MESSAGE           = 0x06,  // Отправка игрового сообщения
	GAME_STATE_REQUEST     = 0x07,  // Запрос состояния игры
	GAME_STATE_RESPONSE    = 0x08,  // Ответ на GAME_STATE_REQUEST
	SERVER_STATE_REQUEST   = 0x09,  // Запрос состояния сервера
	SERVER_STATE_RESPONSE  = 0x0A,  // Ответ на SERVER_STATE_REQUEST
	SET_USER_NAME          = 0x0B,  // Установка имени пользователя

	EMPTY_RESPONSE         = 0xE0,  // Универсальный ответ от сервера

	TEXT_INDICATION        = 0x30,  // Оповещение о новом текстовом сообщении
	GAME_INDICATION        = 0x31,  // Оповещение о новом игровом сообщении
	USERLIST_INDICATION    = 0x32   // Оповещение о смене списка пользователей

}MessageType;

// Состояние сервера
typedef enum
{
	STATE_IDLE             = 0,  // Ожидание
	STATE_PLAYING          = 1,  // В игре
}ServerState;

// Состояние клиента
typedef enum
{
	USER_IDLE              = 0,  // готов
	USER_PLAY              = 1,  // в игре
	USER_AWAY              = 2,  // отошел
	USER_OFFLINE           = 3   // отключен
}UserState;

//VERSION_REQUEST
typedef struct
{
	quint16 hostProtocolVersion;    // Версия протокола хоста
}VersionRequest;

//VERSION_RESPONSE
typedef struct
{
	quint16 protocolVersion;
}VersionResponse;

//USER_LIST_REQUEST
// Без параметров

typedef struct
{
	quint32 userId;
	UserState state;
	Gp_String userName;
}UserInfo;

//USER_LIST_RESPONSE
typedef struct
{
	quint16 userCount;
	UserInfo* users;
}UserListResponse;

//TEXT_MESSAGE_PUBLIC
typedef struct
{
	Gp_String message;
}TextMessagePublic;

//TEXT_MESSAGE_PRIVATE
typedef struct
{
	quint16 userId;
	Gp_String message;
}TextMessagePrivate;

//GAME_MESSAGE
typedef struct
{
	Gp_String message;
}GameMessage;

//GAME_STATE_REQUEST
// Без параметров

//GAME_STATE_RESPONSE
typedef struct
{
	Gp_String state;
}GameStateResponse;

//SERVER_STATE_REQUEST
// Без параметров

//SERVER_STATE_RESPONSE
typedef struct
{
	ServerState state;
}ServerStateResponse;

//SET_USER_NAME
typedef struct
{
	Gp_String name;
}SetUserName;

//TEXT_INDICATION
typedef struct
{
	quint16 userId;
	Gp_String message;
}TextIndication;

//GAME_INDICATION
typedef struct
{
	Gp_String state;
}GameIndication;

//USERLIST_INDICATION
// Без параметров

#endif // PROTOCOL_H
